<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
          "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="utf-8">
<title>QUnit JWS sign HS* test of 'jws.js'</title>
<link rel="stylesheet" href="qunit.css" type="text/css" media="screen" />

<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="qunit.js"></script>

<script language="JavaScript" type="text/javascript" src="../jsrsasign-all-min.js"></script>
<script language="JavaScript" type="text/javascript" src="../src/crypto-1.1.js"></script>
<script language="JavaScript" type="text/javascript" src="../src/jws-3.3.js"></script>

<script type="text/javascript">
$(document).ready(function(){

var sJWSHS256 = 'eyJhbGciOiJIUzI1NiIsICJjdHkiOiJKV1QifQ.eyJhZ2UiOiAyMX0.vcimDRCLttYBHsO7M0S_tCvUIOGz26Ti5nkRuj1QcHc';
var sJWSHS256LP = 'eyJhbGciOiJIUzI1NiIsICJjdHkiOiJKV1QifQ.eyJhZ2UiOiAyMX0.cFJ8ICyb1rj_iczWJ2IdNAT7h2rLFFElH7436Ev1ddA'; // long password 40bytes
var sJWSHS256B6 = 'eyJhbGciOiJIUzI1NiIsICJjdHkiOiJKV1QifQ.eyJhZ2UiOiAyMX0.Gc9TEuqJtoB5MrxZPwomTFfZ46rJrrs07A4T0VQHFaU'; // base64

test("JWS sign HS* password test (sJWSHS256)", function() {
var sJWS;

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', "aaa");
equal(sJWS, sJWSHS256, "pass=aaa");

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', "616161");
equal(sJWS, sJWSHS256, "pass=616161");

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {rstr: "aaa"});
equal(sJWS, sJWSHS256, "pass={rstr: aaa}");

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {utf8: "aaa"});
equal(sJWS, sJWSHS256, "pass={utf8: aaa}");

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {hex: "616161"});
equal(sJWS, sJWSHS256, "pass={hex: 616161}");

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {b64: "YWFh"});
equal(sJWS, sJWSHS256, "pass={b64: YWFh}");

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', "6161616");
notEqual(sJWS, sJWSHS256, "pass=6161616 **INVALID**");

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', "61616");
notEqual(sJWS, sJWSHS256, "pass=61616 **INVALID**");

raises(function() {
sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {hex: "zzzz"});
}, "pass{hex: zzzz} **EXCEPTION**");

raises(function() {
sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {hex: "616"});
}, "pass{hex: 616} **EXCEPTION**");

// long password
sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', "6162636465666768696a6162636465666768696a6162636465666768696a6162636465666768696a");
equal(sJWS, sJWSHS256LP, "pass=(6162..6a x 4) long");

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', "abcdefghijabcdefghijabcdefghijabcdefghij");
equal(sJWS, sJWSHS256LP, "pass=(abc..j x 4) long");

// base64 Mbc1/+QrCg==, Mbc1_-QrCg, 31b735ffe42b
sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {b64: "Mbc1/+QrCg=="});
equal(sJWS, sJWSHS256B6, "pass=Mbc1/+QrCg== base64");

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {b64u: "Mbc1_-QrCg"});
equal(sJWS, sJWSHS256B6, "pass=Mbc1_-QrCg base64url");

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {hex: "31b735ffe42b0a"});
equal(sJWS, sJWSHS256B6, "pass=31b735ffe42b0a base64>hex");
});

test("JWS sign HS* algorithm test (sJWSHS256,384,512)", function() {
var sJWS, sig384, sig512;

sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', "aaa");
equal(sJWS, sJWSHS256, "HS256");

sig384 = "eyJhbGciOiJIUzM4NCIsICJjdHkiOiJKV1QifQ.eyJhZ2UiOiAyMX0.bX10I4Ivadicwp3XA7buwjJXByzrvFWXMNxN3rGOunBxrzNSUNkW8YfTPQordvn2";
sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS384", "cty":"JWT"}', '{"age": 21}', "aaa");
equal(sJWS, sig384, "HS384");

sig512 = "eyJhbGciOiJIUzUxMiIsICJjdHkiOiJKV1QifQ.eyJhZ2UiOiAyMX0.b6HuF_CTLldXzQwAVhsnpEGkbrtquQfjdr8ie_UyqjPFNnGOz-rEvOvfDC_ex4zvVgsARAixM-6Ug9WcnweTgA";
sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS512", "cty":"JWT"}', '{"age": 21}', "aaa");
equal(sJWS, sig512, "HS512");

raises(function() {
  sJWS = KJUR.jws.JWS.sign("HS384", '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', "aaa");
}, "alg HS384 != header.HS256");

});

test("JWS sign header and/or payload by object test", function() {
var sJWS, pHeader, pPayload;

equal(JSON.stringify({alg: "HS256", cty: "JWT"}), '{"alg":"HS256","cty":"JWT"}', 
      "if this sub test fails, there is NO PROBLEM that all of following sub test fail.");

sJWS = KJUR.jws.JWS.sign(null, {"alg":"HS256", "cty":"JWT"}, {"age": 21}, "aaa");
equal(sJWS, 'eyJhbGciOiJIUzI1NiIsImN0eSI6IkpXVCJ9.eyJhZ2UiOjIxfQ.pLem30ReEpeXgMt6e3gjZ6QYSpLBbhd_NB-Afud1m4A', 'by header, payload object {}');

pHeader = {};
pHeader.alg = "HS256";
pHeader.cty = "JWT";
pPayload = {};
pPayload.age = 21;
sJWS = KJUR.jws.JWS.sign(null, pHeader, pPayload, "aaa");
equal(sJWS, 'eyJhbGciOiJIUzI1NiIsImN0eSI6IkpXVCJ9.eyJhZ2UiOjIxfQ.pLem30ReEpeXgMt6e3gjZ6QYSpLBbhd_NB-Afud1m4A', 'by header, payload object p.age=21');

});

var hJWSHSPass = "616161";
var sJWSHS256 = 'eyJhbGciOiJIUzI1NiIsICJjdHkiOiJKV1QifQ.eyJhZ2UiOiAyMX0.vcimDRCLttYBHsO7M0S_tCvUIOGz26Ti5nkRuj1QcHc';
var sJWSHS512 = 'eyJhbGciOiJIUzUxMiIsICJjdHkiOiJKV1QifQ.eyJhZ2UiOiAyMX0.b6HuF_CTLldXzQwAVhsnpEGkbrtquQfjdr8ie_UyqjPFNnGOz-rEvOvfDC_ex4zvVgsARAixM-6Ug9WcnweTgA';

// *** VERIFICATION TESTS *****************************************
test("verify test for algorithm HS256", function() {
  var result = KJUR.jws.JWS.verify(sJWSHS256, hJWSHSPass);
  equal(result, true, "pass=616161");

  var result = KJUR.jws.JWS.verify(sJWSHS256, "aaa");
  equal(result, true, "pass=aaa");

  var result = KJUR.jws.JWS.verify(sJWSHS256, {hex: "616161"});
  equal(result, true, "pass={hex:616161}");

  var result = KJUR.jws.JWS.verify(sJWSHS256, {utf8: "aaa"});
  equal(result, true, "pass={utf8:aaa}");

  var result = KJUR.jws.JWS.verify(sJWSHS256, {rstr: "aaa"});
  equal(result, true, "pass={rstr:aaa}");

  var result = KJUR.jws.JWS.verify(sJWSHS256, {b64: "YWFh"});
  equal(result, true, "pass={b64:YWFh}");

  var result = KJUR.jws.JWS.verify(sJWSHS256, {b64u: "YWFh"});
  equal(result, true, "pass={b64u:YWFh}");

  var result = KJUR.jws.JWS.verify(sJWSHS256, "aab");
  equal(result, false, "pass=aab FALSE");
});

test("verify test for algorithm HS512", function() {
  var result = KJUR.jws.JWS.verify(sJWSHS512, hJWSHSPass);
  equal(result, true, "");
});

// *** ALGORITHM ACCEPTANCE TESTS *****************************************
test("arg acceptAlgs test (HS256 not in [HS512])", function() {
  expect(1);
  var msg = "";
  try {
    var result = KJUR.jws.JWS.verify(sJWSHS256, hJWSHSPass, ["HS512"]);
  } catch(ex) {
    msg = ex;
  }
  equal(msg, "algorithm 'HS256' not accepted in the list", "");
});

test("arg acceptAlgs test (HS256 in [HS256])", function() {
  expect(1);
  var msg = "";
  try {
    var result = KJUR.jws.JWS.verify(sJWSHS256, hJWSHSPass, ["HS256"]);
  } catch(ex) {
    msg = ex;
  }
  equal(msg, "", "");
});


});

</script>
  

</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture">test markup</div>
<p>
<a href="../">TOP</a> | 
<a href="index.html">TEST INDEX</a> | 
<a href="qunit-do-jws-sign.html">asynmetric key(RS/PS/ES) sign/verify</a> | 
<a href="qunit-do-jws-sign-hs.html">Hmac(HS) sign/verify</a> | 
<a href="qunit-do-jws-sign-slow.html">sign/verify slow</a> | 
<a href="qunit-do-jws-intdate.html">IntDate</a> | 
</p>
</body>
</html>

